/*
svr acc之间rpc协议
*/

#pragma once

#include <string>
#include <vector>
#include <string.h>
#include "../external/rpc_libevent_cpp/src/RpcNet.h"

#ifndef uint32
using uint16 = uint16_t;
using uint32 = uint32_t;
using uint64 = uint64_t;
using int64 = int64_t;
using uint8 = unsigned char;
using int32 = int;
#endif

#pragma pack(push)
#pragma pack(1)
namespace proto {

	const static uint16 MAX_BROADCAST_CID_NUM = 400; //指定广播 cid最大数量
	const static uint16 MAX_MAIN_CMD_ID = 20; //mainCmd 最大值. 不能超过256。 mainCmd可以0 开始。 20种服务器足够游戏用了

	//acc提供服务器的 cmdId, 对应函数名
	enum class AccCmd : char
	{
		Reg = CUSTOM_FUN_ID,
		Seting,
		DisconAll, //5
		Discon,
		VerifyRet,
		CreateSession,
		CacheMsg,
		Broadcast, //10
		Forward,
		GetAddr,
		DelSession,
	};
	//Acc Driver提供服务器的 cmdId, 对应函数名
	enum class AdCmd : char
	{
		Forward = CUSTOM_FUN_ID,
		VerifyReq,
		NtfDiscon, //5
	};

	// 设定心跳检查功能，心跳包信息{cmd, interval, rsp cmd}
	// 默认不需要心跳功能
	struct HeartBeatInfo
	{
		uint32 req_cmd = 0;	            //客户端请求消息号
		uint32 rsp_cmd = 0;	            //svr 响应给客户端额消息号
		uint32 interval_sec = 60;        //心跳过期间隔秒
	};
	REFLECTION(HeartBeatInfo, req_cmd, rsp_cmd, interval_sec);

	struct ClientLimitInfo
	{
		uint32 max_num = 5000;		//acc 支持 client最大数量 //std::numeric_limits<uint32>::max()
		uint32 rsp_cmd = 0;				//acc超出 client数量，给client响应. cmd
		std::string rsp_msg;	    //acc超出 client数量，给client响应. msg
	};
	REFLECTION(ClientLimitInfo, max_num, rsp_cmd, rsp_msg);

	//	svr请求设置acc设置。
	struct  AccSeting
	{
		HeartBeatInfo hbi;			//client 和 acc 心跳相关
		ClientLimitInfo cli;		//client 相关设置
		uint32 noMsgSpanSec = 0;    //client连接成功，不发消息的超时时间。
		uint8 mainSvrCmd = 0;      //值为main_cmd 。 表示 main_cmd关联的svr为main svr
	};
	REFLECTION(AccSeting, hbi, cli, noMsgSpanSec, mainSvrCmd);
}
#pragma pack(pop)



